
class MyClass:
    "一个简单的类"
    i = 12345
    #类有一个名为 __init__() 的特殊方法（构造方法），该方法在类实例化时会自动调用
    def __init__(self):
        self.data = [3,2,5,8,4,7,6,9]

    #类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self
    def f(self):
        return 'hello,world'

# __init__() 构造方法可以有参数
#self代表类的实例，而非类
class MyClass2:
    def __init__(self,arg1,arg2):
        self.x = arg1
        self.y = arg2



#类的方法：在类的内部，使用 def 关键字来定义一个方法，与一般函数定义不同，类方法必须包含参数 self, 且为第一个参数，self 代表的是类的实例。
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性，私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,name,age,weight):
        self.name = name
        self.age = age
        self.__weight = weight
    #定义方法
    def speak(self):
        print("%s 说：我 %d 岁"%(self.name,self.age))


#单继承
class student(people):
    #定义属性
    grade = ''
    #构造方法
    def __init__(self,name,age,weight,g):
        #调用父类构造方法
        #people.__init__(self,name,age,weight) 有问题
        super(student, self).__init__(name,age,weight)#super关键字去调用
        self.grade = g
    #复写父类方法
    def speak(self):
        print("%s 说: 我 %d 岁了，我在读 %d 年级"%(self.name,self.age,self.grade))

#多继承

#另一个父类，为多重继承做准备
class Speaker():
    topic = ''
    name = ''
    def __init__(self,topic,name):
        self.topic = topic
        self.name = name
    def speak(self):
        print("我叫 %s，我是一个演说家，我演讲的主题是 %s" % (self.name, self.topic))

#子类
class Student2(Speaker,student):
    a = ''
    def __init__(self,a,topic,name,weigth,g):
        student.__init__(self,name,a,weigth,g)
        Speaker.__init__(self,topic,name)
        self.a = a

##类属性与方法
#类的私有属性
#__private_attrs：两个下划线开头，声明该属性为私有，不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs
#类的方法:在类的内部，使用 def 关键字来定义一个方法，与一般函数定义不同，类方法必须包含参数 self，且为第一个参数，self 代表的是类的实例。self 的名字并不是规定死的，也可以使用 this，但是最好还是按照约定是用 self
#类的私有方法
#__private_method：两个下划线开头，声明该方法为私有方法，只能在类的内部调用 ，不能在类的外部调用。self.__private_methods。

"""
静态方法: 用 @staticmethod 装饰的不带 self 参数的方法叫做静态方法，类的静态方法可以没有参数，可以直接使用类名调用。

普通方法: 默认有个self参数，且只能被对象调用。

类方法: 默认有个 cls 参数，可以被类和对象调用，需要加上 @classmethod 装饰器。"""
if __name__ == '__main__':
    my = MyClass() #实例化类
    print(my.i) #访问类的属性和方法
    print(my.f())
    print(my.data)

    my2 = MyClass2(2,6)
    print(my2.x)
    print(my2.y)

    people = people("jack",22,68)
    people.speak()

    s = student('ken',10,45,5)
    s.speak()
    super(student,s).speak()#用子类对象调用父类已被覆盖的方法

    s2 = Student2(25,"Python","Tim",80,4,)
    s2.speak()#方法名同，默认调用的是在括号中排前地父类的方法
